/*
 * ACM Timus Online
 * Average Common Prefix - Problem 1393
 *
 * solution: http://infoarena.ro/siruri-de-sufixe
 */

#include <cstdio>
#include <cstring>
#include <cstdlib>

#define MAXN	2*262144

int N;
char A[MAXN];
int S[MAXN], SA[MAXN];
int *LCP;

// stably sort a[0..n-1] to b[0..n-1] with keys in 0..K from r
static void radixPass(int* a, int* b, int* r, int n, int K) 
{ // count occurrences
	int* c = new int[K + 1];                          	// counter array

	for (int i = 0; i <= K; i++) 
		c[i] = 0;         				// reset counters
	for (int i = 0; i < n; i++) 
		c[r[a[i]]]++;    				// count occurences
	for (int i = 0, sum = 0; i <= K;  i++) 
	{ 							// exclusive prefix sums
		int t = c[i];  
		c[i] = sum;  
		sum += t;
	}
	for (int i = 0;  i < n;  i++) 
		b[c[r[a[i]]]++] = a[i];      			// sort
	delete [] c;
}

inline bool leq(int a1, int a2,   int b1, int b2) 
{ 								// lexic. order for pairs
  return(a1 < b1 || a1 == b1 && a2 <= b2); 
}                                                		// and triples
inline bool leq(int a1, int a2, int a3,   int b1, int b2, int b3) 
{
  return(a1 < b1 || a1 == b1 && leq(a2,a3, b2,b3)); 
}


// find the suffix array SA of s[0..n-1] in {1..K}^n
// require s[n]=s[n+1]=s[n+2]=0, n>=2
void suffixArray(int* s, int* SA, int n, int K) 
{
  int n0=(n+2)/3, n1=(n+1)/3, n2=n/3, n02=n0+n2; 
  int* s12  = new int[n02 + 3];  s12[n02]= s12[n02+1]= s12[n02+2]=0; 
  int* SA12 = new int[n02 + 3]; SA12[n02]=SA12[n02+1]=SA12[n02+2]=0;
  int* s0   = new int[n0];
  int* SA0  = new int[n0];
 
  // generate positions of mod 1 and mod  2 suffixes
  // the "+(n0-n1)" adds a dummy mod 1 suffix if n%3 == 1
  for (int i=0, j=0;  i < n+(n0-n1);  i++) if (i%3 != 0) s12[j++] = i;

  // lsb radix sort the mod 1 and mod 2 triples
  radixPass(s12 , SA12, s+2, n02, K);
  radixPass(SA12, s12 , s+1, n02, K);  
  radixPass(s12 , SA12, s  , n02, K);

  // find lexicographic names of triples
  int name = 0, c0 = -1, c1 = -1, c2 = -1;
  for (int i = 0;  i < n02;  i++) {
    if (s[SA12[i]] != c0 || s[SA12[i]+1] != c1 || s[SA12[i]+2] != c2) { 
      name++;  c0 = s[SA12[i]];  c1 = s[SA12[i]+1];  c2 = s[SA12[i]+2];
    }
    if (SA12[i] % 3 == 1) { s12[SA12[i]/3]      = name; } // left half
    else                  { s12[SA12[i]/3 + n0] = name; } // right half
  }

  // recurse if names are not yet unique
  if (name < n02) {
    suffixArray(s12, SA12, n02, name);
    // store unique names in s12 using the suffix array 
    for (int i = 0;  i < n02;  i++) s12[SA12[i]] = i + 1;
  } else // generate the suffix array of s12 directly
    for (int i = 0;  i < n02;  i++) SA12[s12[i] - 1] = i; 

  // stably sort the mod 0 suffixes from SA12 by their first character
  for (int i=0, j=0;  i < n02;  i++) if (SA12[i] < n0) s0[j++] = 3*SA12[i];
  radixPass(s0, SA0, s, n0, K);

  // merge sorted SA0 suffixes and sorted SA12 suffixes
  for (int p=0,  t=n0-n1,  k=0;  k < n;  k++) {
#define GetI() (SA12[t] < n0 ? SA12[t] * 3 + 1 : (SA12[t] - n0) * 3 + 2)
    int i = GetI(); // pos of current offset 12 suffix
    int j = SA0[p]; // pos of current offset 0  suffix
    if (SA12[t] < n0 ? 
        leq(s[i],       s12[SA12[t] + n0], s[j],       s12[j/3]) :
        leq(s[i],s[i+1],s12[SA12[t]-n0+1], s[j],s[j+1],s12[j/3+n0]))
    { // suffix from SA12 is smaller
      SA[k] = i;  t++;
      if (t == n02) { // done --- only SA0 suffixes left
        for (k++;  p < n0;  p++, k++) SA[k] = SA0[p];
      }
    } else { 
      SA[k] = j;  p++; 
      if (p == n0)  { // done --- only SA12 suffixes left
        for (k++;  t < n02;  t++, k++) SA[k] = GetI(); 
      }
    }  
  } 
  delete [] s12; delete [] SA12; delete [] SA0; delete [] s0; 
}

/* lcpa is used by the java native method */

int
lcpa(const int *a, const char *s0, int *lcp, int n)
{
	int i, h;
	char *s = (char*)s0;
	int *inv = (int*)malloc(n*sizeof(int));

	if(inv == 0)
		return 0;
	for(i=0; i<n; i++)
		inv[a[i]] = i;

	h = 0;			/* visit in string order */
	for(i=0; i<n-1; i++) {  /* omit last, least suff */
		int x = inv[i]; /* i,j,x,h as in intro */
		int j = a[x-1];
		char *p1 = s + i + h;
		char *p0 = s + j + h;
		while(*p1++ == *p0++)
			h++;
		lcp[x] = h;
		if(h > 0)
			h--;
	}
	lcp[0] = 0;	/* least suffix has no predecessor */
	free(inv);
	return 1;
}


int*
lcp(const int *a, const char *s, int n) 
{
	int *lcp = (int*)malloc(n*sizeof(int));

	if(lcp == 0)
		return 0;
	if(lcpa(a, s, lcp, n) == 0) {
		free(lcp);
		return 0;
	}
	return lcp;
}



int main() 
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "rt", stdin);
#endif
	scanf("%d\n%s", &N, &A);
	memcpy(A + N, A, N);
	N = 2 * N;

	A[N] = A[N + 1] = A[N + 2] = 0;
	int i;

	for (i = 0; i < N; i++)
		S[i] = A[i] - 'A';

	suffixArray(S, SA, N, 26);

	for (i = 0; i < N; i++) 
		printf("%d ", SA[i]);
	printf("\n");
	LCP = lcp(SA, A, N);

	double answer = 0;
	if (LCP)
	{
		for (i = 0; i < N; i++)
		{
			printf("%d ", LCP[i]);
			answer += LCP[i];
		}
		printf("\n");

		answer /= N - 1;
		printf("%.3lf\n", answer);
	}
	
	return 0;
}
